import uvicorn
from fastapi import FastAPI, Request, status
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
from contextlib import asynccontextmanager

from src.routes.v1 import questions  # 导入题目管理API路由
from database import create_tables
from src.core.config import settings  # 项目配置


# ------------------------------
# 应用生命周期管理
# ------------------------------
@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    应用生命周期上下文

    在应用启动时执行初始化操作，关闭时执行清理操作
    """
    # 启动时：创建数据库表（如果不存在）
    # 注意：生产环境建议使用 Alembic 迁移工具，这里仅为演示
    create_tables()
    print(f"数据库表初始化完成（数据库：{settings.mysql_db}）")
    print(settings.db_url_sync)

    yield  # 应用运行中

    # 关闭时：可执行清理操作（如关闭连接池）
    print("应用关闭中...")


# ------------------------------
# 创建FastAPI应用实例
# ------------------------------
app = FastAPI(
    title=settings.project_name,  # API文档标题
    description="智能题库系统API接口（支持AI生成题目、题库管理等功能）",
    version="1.0.0",
    lifespan=lifespan  # 绑定生命周期
)

# ------------------------------
# 全局中间件
# ------------------------------
# 启用CORS（跨域资源共享）
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 开发环境允许所有源，生产环境需指定具体域名
    allow_credentials=True,
    allow_methods=["*"],  # 允许所有HTTP方法
    allow_headers=["*"],  # 允许所有HTTP头
)

# 启用GZip压缩（减少网络传输量）
app.add_middleware(GZipMiddleware, minimum_size=1000)  # 大于1KB的响应才压缩


# ------------------------------
# 全局异常处理器
# ------------------------------
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
    """捕获所有未处理的异常，返回统一格式的错误响应"""
    return JSONResponse(
        status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
        content={
            "code": 500,
            "message": f"服务器内部错误: {str(exc)}",
            "data": None
        }
    )


# ------------------------------
# 注册API路由
# ------------------------------
app.include_router(questions.router)  # 注册试卷管理模块


# ------------------------------
# 根路径接口
# ------------------------------
@app.get("/")
async def read_root():
    return {
        "message": f"欢迎使用{settings.project_name}",
        "docs_url": "/docs",  # Swagger文档地址
        "redoc_url": "/redoc"  # ReDoc文档地址
    }

if __name__ == "__main__":
    uvicorn.run('main:app', host='localhost', port=8000, reload=True)